package com.meidaia.java.main;

import com.meidaia.java.main.pojo.AIAssistant;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class AIAssistants {
    private static final int DEFAULT_CAPACITY = 10;
    private static final int EXPANSION_FACTOR = 2;

    private AIAssistant[] data;
    // map中保存的 key 为助手id，value保存的为在data数组中的位置
    private static Map<Integer, Integer> map;
    private int capacity = 0;
    private int size = 0;

    public void init() {
        //初始大小设定为10
        capacity = DEFAULT_CAPACITY;
        data = new AIAssistant[capacity];
        map = new HashMap<>();
        /*
         * 1. ID: 101, 名称: 小智, 类型: 语音助手, 版本: v1.2, 状态: 在线, 能力评分: 85 [语音助手]
         * 2. ID: 102, 名称: 文小助, 类型: 文本助手, 版本: v2.0, 状态: 在线, 能力评分: 92 [文本助手]
         * 3. ID: 103, 名称: 图灵, 类型: 图像助手, 版本: v1.5, 状态: 离线, 能力评分: 88 [图像助手]
         * 4. ID: 104, 名称: 数小析, 类型: 数据分析助手, 版本: v1.0, 状态: 在线, 能力评分: 79 [数据分析助手]
         * 5. ID: 105, 名称: 翻译精灵, 类型: 翻译助手, 版本: v2.1, 状态: 离线, 能力评分: 95 [翻译助手]
         */
        data[size] = new AIAssistant(101, "小智", "语音助手", 1.2D, true, 85);
        map.put(101, size++);
        data[size] = new AIAssistant(102, "文小助", "文本助手", 2.0D, true, 92);
        map.put(102, size++);
        data[size] = new AIAssistant(103, "图灵", "图像助手", 1.5D, false, 88);
        map.put(103, size++);
        data[size] = new AIAssistant(104, "数小析", "数据分析助手", 1.0D, true, 79);
        map.put(104, size++);
        data[size] = new AIAssistant(105, "翻译精灵", "翻译助手", 2.1D, false, 95);
        map.put(105, size++);

    }

    public AIAssistants() {
        init();
    }


    /**
     * 添加元素
     *
     * @param aiAssistant 助手对象
     * @return 结果
     */
    public String add(AIAssistant aiAssistant) {
        if (map.containsKey(aiAssistant.getId())) {
            return "⚠ 添加失败，ID已存在";
        }

        //如果当前容量达到最大，进行扩容
        if (size == capacity) {
            expansion();
        }

        //添加数据
        //在第一个为null的地方插入
        for (int i = 0; i < size; ++i) {
            if (data[i] == null) {
                data[i] = aiAssistant;
                break;
            }
        }
        size++;

        return "✅ 助手【" + aiAssistant.getName() + "】添加成功！";
    }

    /**
     * 对当前data进行扩容
     */
    private void expansion() {
        //扩容指定倍数
        capacity *= EXPANSION_FACTOR;

        data = Arrays.copyOf(data, capacity);
    }

    /**
     * 获取容量
     * @return 容量
     */
    public int size(){
        return capacity;
    }

    /**
     * 获取元素个数
     * @return 元素个数
     */
    public int dataCnt(){
        return size;
    }

    /**
     * 获取所有元素
     * @return 助手数组
     */
    public AIAssistant[] getAll(){
        AIAssistant[] ret = new AIAssistant[size];
        int index = 0;
        for(int i : map.values()){
            ret[index++] = data[i];
        }
        return ret;
    }


    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        //直接遍历map值
        int index = 1;
        for (int i : map.values()) {
            builder.append(index++).append(". ")
                    .append(data[i].toString())
                    .append(System.lineSeparator());
        }

        return builder.toString();
    }

    /**
     * 通过助手id查询
     *
     * @param choose 助手id
     * @return 助手描述信息
     */
    public AIAssistant selectById(int choose) {
        for (int i = 0; i < size; i++) {
            if (data[i].getId() == choose) {
                return data[i];
            }
        }
        return null;
    }

    /**
     * 通过id删除元素
     *
     * @param choose 助手id
     * @return 结果
     */
    public String deleteById(int choose) {
        //
        if (!map.containsKey(choose)) {
            return "助手不存在";
        }

        //通过id查找下标
        int index = map.get(choose);
        String ret = "✅ 助手【" + data[index].getName() + "】已删除。";

        //元素置空
        data[index] = null;
        //map删除
        map.remove(choose);
        size--;

        return ret;
    }

    /**
     * 更新数据
     * @param aiAssistant 助手对象
     * @return 结果
     */
    public boolean update(AIAssistant aiAssistant) {
        Integer index = map.get(aiAssistant.getId());
        data[index] = aiAssistant;
        return true;
    }
}
